package fr.syntheses.blog.Model.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.sql.Date;
import org.apache.log4j.Logger;


import fr.syntheses.blog.beans.Article;


public class ArticleDAO extends ModeleDAO {


	Logger log = Logger.getLogger(ArticleDAO.class);

	// variables
	Connection cnx = null;
	ResultSet resultat= null;
	String requeteString=null;
	private static List<Article> listeArticle;
	PreparedStatement requete = null;
	private Article article;

	/**
	 * Cette methode permet de lister des articles
	 * @return 
	 */
	public List<Article> listerArticles() {


		log.debug("Entering in listerArticle()");


		listeArticle = new ArrayList<Article>();

		Article article = null;

		try {
			// open connection

			cnx = super.getConnection();

			// requete select * from Utilisateur whr

			requeteString = "SELECT * FROM article WHERE 1 ORDER BY Datepublication ";



			// statement
			requete = cnx.prepareStatement(requeteString);

			resultat = requete.executeQuery();
			// on qtoke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{

					// On effectue le mapping des attributs avec les champs de la table SQL
					article=mapperArticle(resultat);

					// On ajoute l'objet a la liste des articles
					listeArticle.add((Article)article);
				}
			}
		}
		catch(Exception e)
		{
			log.debug("Erreur dans la requete dans la classe articleDAO ");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(cnx!=null)
				{
					GestionBaseDeDonnees.closeConnection(cnx);
				}
			}
			catch(Exception ex)
			{
				log.debug("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe article");
			}	
		}

		// Retourner la liste des articles
		return listeArticle;
	}


	// MAPPER article ========================================================== //



	public Article mapperArticle(ResultSet resultat) {
		Article article= new Article();

		try {
			if (resultat.getString("Id") == null)
			{
				article.setId(0);
			}
			else {

				article.setId(resultat.getInt("Id"));
			}


			if (resultat.getString("Titre") == null) {
				article.setTitre("");
			} else {
				article.setTitre(resultat.getString("Titre"));
			}


			if (resultat.getString("Contenu") == null) {
				article.setContenu("");
			} else {
				article.setContenu(resultat.getString("Contenu"));
			}

			if (resultat.getString("categorieId") == null) {
				article.setContenu("");
			} else {
				article.setCategorie(resultat.getString("categorieId"));
			}

			if (resultat.getDate("Datepublication") == null) {
				article.setDatepublication(null);
			} else {
				article.setDatepublication(resultat.getDate("Datepublication"));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		log.debug("in mapper exit with utilisateur" + article);
		return article;
	}



	/**
	 * Cette methode permet d'ecrire un article dans la base de données
	 * @return 
	 */
	public void createArticle (Article article) {
		// variable

		log.info("entering in  createArticle (Article article)" + article);

		PreparedStatement requete = null;
		Connection cnx = null;
		int codeErreur=0;
		String requeteString=null;

		try {
			// open connection

			cnx = super.getConnection();

			// requete select * from Utilisateur whr

			requeteString = "INSERT INTO article (categorieId, UtilisateurId, Titre, Contenu, Datepublication) VALUES (?,?,?,?,?)";

			requete= cnx.prepareStatement(requeteString);
			requete.setString(1,article.getCategorie());
			requete.setString(2,article.getAuteur());
			requete.setString(3,article.getTitre());
			requete.setString(4,article.getContenu());
			requete.setDate(5, new Date(new java.util.Date().getTime())); 

			codeErreur = requete.executeUpdate();

		}
		catch (Exception e){
			codeErreur=0;
			log.debug("erreur dans la requete dans la classe ArticleDAO fonction createArticle" + e);
		}

		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(cnx!=null)
				{
					GestionBaseDeDonnees.closeConnection(cnx);
				}
			}
			catch(Exception ex)
			{
				log.debug("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la method createArticle"  + ex);

			}

		}



	}
	public void read() {

	}

	public void update() {

	}



	//------------Méthode de suppression d'article


	public int delete(int idArticle) {

		// variable

		log.info("entering in  deleteArticle (Article article)" + idArticle);

		PreparedStatement requete = null;

		Connection cnx = null;

		int codeErreur=0;

		String requeteString=null;

		try {
			// open connection

			cnx = super.getConnection();

			// requete select * from Utilisateur whr

			requeteString = "DELETE FROM article WHERE id=?";

			requete= cnx.prepareStatement(requeteString);

			requete.setInt(1, idArticle);

			codeErreur = requete.executeUpdate();

		}
		catch (Exception e){

			codeErreur=0;

			log.debug("erreur dans la requete dans la classe ArticleDAO fonction createArticle" + e);
		}

		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(cnx!=null)
				{
					GestionBaseDeDonnees.closeConnection(cnx);
				}
			}
			catch(Exception ex)
			{
				log.debug("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la method deleteArticle"  + ex);

			}

		}
		return codeErreur;

	}


	//------------Méthode de MODIFICATION d'article

//------m"thode d'affichage d'article dans la vue avant sa modification

	public Article editer(int idArticle) {

		PreparedStatement requete = null;

		Connection cnx = null;

		int codeErreur=0;

		String requeteString=null;

		try {

		

			// open connection

			cnx = super.getConnection();


			//préparation de la requtte

			requeteString = "SELECT * FROM article WHERE id=?";
			requete= cnx.prepareStatement(requeteString);
			requete.setInt(1, idArticle);
						

			//excution de la requette
			resultat = requete.executeQuery();

			if(resultat!=null)
			{
				while(resultat.next())
				{

					// On effectue le mapping des attributs avec les champs de la table SQL

					article = mapperArticle(resultat);
					codeErreur=1;

				}
			}
			
			else
              {
					codeErreur=0;
              }
		
		}
		catch (Exception e){

			e.printStackTrace();
			log.debug("erreur dans la requete dans la classe ArticleDAO fonction createArticle" + e);
		}

		return article;
	}
			
	
	

	//------------Méthode de MODIFICATION d'article
	
	public int update(Article article) {
		System.err.println("okokok");
		// Variables
				PreparedStatement requete=null;
				String requeteString=null;
				int codeErreur=0;
			
				try
				{			
					// Ouverture d'une connexion
					cnx=super.getConnection();
					
					// Cr�ation de la requ�te
					requeteString="UPDATE article set CategorieId=?, UtilisateurId=?, Titre=?, Contenu=?, Datepublication=? WHERE Id=?";
					requete=cnx.prepareStatement(requeteString);
					
					
					
					requete.setString(1,article.getCategorie());
					requete.setString(2,article.getAuteur());
					requete.setString(3,article.getTitre());
					requete.setString(4,article.getContenu());
					
					requete.setDate(5, new Date(new java.util.Date().getTime())); 
					requete.setInt(6,article.getId());
					
					System.out.println("codeErreur"+ requete);
						
					// Execution de la requ�te
					
					codeErreur = requete.executeUpdate();
				
					System.err.println("requete excutée!!");
	}
				catch (Exception e){

					e.printStackTrace();
					log.debug("erreur dans la requete dans la classe ArticleDAO fonction update" + e);
				}
				
				
				finally
				{
					try
					{
						// Fermeture de la connexion
						if(resultat!=null)
						{
							GestionBaseDeDonnees.closeResulset(resultat);
						}
						if(requete!=null)
						{
							GestionBaseDeDonnees.closeRequest(requete);
						}
						if(cnx!=null)
						{
							GestionBaseDeDonnees.closeConnection(cnx);
						}
					}
					catch(Exception ex)
					{
						log.debug("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la method updateArticle"  + ex);
						
					}
				}
				System.out.println("codeErreur"+ codeErreur);
				// Retourner le code d'erreur
				return codeErreur;
				
	}

	// MAPPER article ========================================================== //




}
